home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 6 / CU Amiga Magazine's Super CD-ROM 06 (1996)(EMAP Images)(GB)(Track 1 of 4)[!][issue 1997-01].iso / cucd / online / fidonetts / 3csrc.lzh / 3mailout.c < prev    next >
C/C++ Source or Header  |  1992-05-01  |  5KB  |  171 lines

  1. /* 3mailout.c
  2.  * Public Domain
  3.  *
  4.  * contains functions to write a type 3 ASCII packet
  5.  *
  6.  * code as written is memory thrifty.  performance enhancements would involve
  7.  * building the header in memory and writing in one operation.  note there is
  8.  * no function for writing message text; this can too easily be accomplished
  9.  * with a simple write().  note these functions always properly terminate the
  10.  * packet (but seek back so next read overwrites terminator)
  11.  *
  12.  * there is no single user-callable function for this module.  too much
  13.  * depends on how and in what form you get the message from the local
  14.  * message base, and where and by what name you write packets for your
  15.  * mailer.
  16.  */
  17.  
  18. #include "3mail.h"
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <io.h>
  25. #include <fcntl.h>
  26. #include <share.h>
  27.  
  28.  
  29.  
  30. void finish_3pktpartcr (int o3handle,int *error) {
  31.  
  32.   /* terminate a header */
  33.  
  34.   long pos;
  35.  
  36.   if(write(o3handle,"\r",2) < 2) *error = BADWRITE3;  /* \r + \0 */
  37.   pos = tell(o3handle);
  38.   if(pos) {               /* back up over terminating NUL */
  39.     if(lseek(o3handle,pos - 1L,SEEK_SET) == -1L) *error = BADSEEK3;
  40.   }
  41. }
  42.  
  43.  
  44.  
  45. int write_3tag (int o3handle,char *tag,char *data, int *error) {
  46.  
  47.   /* write a tag + data line
  48.    * handles tags without data and data without tags, too
  49.    */
  50.  
  51.   char s[258] = "";
  52.   int writlen = 0;
  53.  
  54.   if(tag && *tag) {
  55.     strcpy(s,tag);
  56.   }
  57.  
  58.   if(data && *data) {
  59.     if(tag && *tag) strcat(s," ");
  60.     strncat(s,data,255 - strlen(s));
  61.   }
  62.  
  63.   strcat(s,"\r");
  64.  
  65.   writlen = write(o3handle,s,strlen(s));
  66.   if(writlen == -1) *error = BADWRITE3;
  67.   return writlen;
  68. }
  69.  
  70.  
  71. int write_3tags (int o3handle,TAG3 *head,int *error) {
  72.  
  73.   /* write a linked list of tag+data lines */
  74.  
  75.   TAG3 *info = head,*next;
  76.  
  77.   while(info) {
  78.     next = info->next;
  79.     if(write_3tag(o3handle,info->tag,info->data,error) < 1) {
  80.       return -1;
  81.     }
  82.   }
  83.   return 0;
  84. }
  85.  
  86.  
  87. int write_3pkthdr (int o3handle,PHDR3 *cpkt,int *error) {
  88.  
  89.   /* write a complete PHDR3 packet header structure to disk */
  90.  
  91.   int writlen = 0;
  92.  
  93.   *error = NOERR3;
  94.   writlen += write(o3handle,ASCII3ID"\r",7);
  95.   writlen += write_3tag(o3handle,NULL,cpkt->from,error);
  96.   writlen += write_3tag(o3handle,NULL,cpkt->to,error);
  97.   writlen += write_3tag(o3handle,NULL,cpkt->creator,error);
  98.   writlen += write_3tag(o3handle,NULL,cpkt->pword,error);
  99.   writlen += write_3tag(o3handle,NULL,cpkt->area,error);
  100.   writlen += write_3tags(o3handle,cpkt->head,error);
  101.   finish_3pktpartcr(o3handle,error);
  102.   return writlen;
  103. }
  104.  
  105.  
  106. int wopen_3pkt (int o3handle,char *fname,PHDR3 *cpkt,int *error) {
  107.  
  108.   /* open a type 3 packet for output, write header if new packet
  109.    * fname = name of packet file
  110.    * cpkt = packet header (written if new packet)
  111.    * *error = error code return
  112.    * o3handle = handle to current packet (or -1 for none)
  113.    * returns handle to packet
  114.    */
  115.  
  116.   static int last = -1;
  117.   long       pos;
  118.  
  119.   *error = NOERR3;
  120.   if(o3handle != -1 && o3handle != last) {  /* avoid opening already open file
  121.                                                since open is a slow operation
  122.                                                on many systems */
  123.     close(o3handle);
  124.     o3handle = -1;
  125.   }
  126.  
  127.   if(o3handle == -1) {
  128.     o3handle = sopen(fname,O_RDWR | O_BINARY | O_CREAT,SH_DENYWR,S_IWRITE);
  129.     if(o3handle != -1) {           /* opened; new packet? */
  130.       lseek(o3handle,0L,SEEK_END);
  131.       if((pos = tell(o3handle)) == 0L) {   /* yes; write header */
  132.         write_3pkthdr(o3handle,cpkt,error);
  133.       }
  134.       else {                            /* no, pos for output */
  135.         if(lseek(o3handle,pos - 1L,SEEK_SET) == -1L) *error = BADSEEK3;
  136.       }
  137.     }
  138.     else *error = NOOPEN3;  /* couldn't open */
  139.   }
  140.  
  141.   return o3handle;
  142. }
  143.  
  144.  
  145. int wclose_3pkt (int o3handle) {    /* close packet */
  146.  
  147.   if(o3handle != -1) close(o3handle); /* close if good handle */
  148.   o3handle = -1;                      /* in case you make it global... */
  149.   return o3handle;
  150. }
  151.  
  152.  
  153. int write_3msghdr (int o3handle,MHDR3 *cmsg,int *error) {
  154.  
  155.   /* write a complete MHDR3 message header structure to disk */
  156.  
  157.   int writlen = 0;
  158.  
  159.   *error = NOERR3;
  160.   writlen += write_3tag(o3handle,NULL,cmsg->from,error);
  161.   writlen += write_3tag(o3handle,NULL,cmsg->to,error);
  162.   writlen += write_3tag(o3handle,NULL,cmsg->subj,error);
  163.   writlen += write_3tag(o3handle,NULL,cmsg->date,error);
  164.   writlen += write_3tag(o3handle,NULL,cmsg->area,error);
  165.   writlen += write_3tag(o3handle,NULL,cmsg->id,error);
  166.   writlen += write_3tag(o3handle,NULL,cmsg->ref,error);
  167.   writlen += write_3tags(o3handle,cmsg->head,error);
  168.   finish_3pktpartcr(o3handle,error);
  169.   return writlen;
  170. }
  171.